package main;

import inteligencia_mapa.MovimientoMapa;

import java.awt.Container;
import java.io.File;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Vector;

import javax.swing.text.AbstractDocument.Content;
import javax.swing.text.StyledEditorKit.BoldAction;

import TDADiccionario.DiccHashAb;
import TDADiccionario.Diccionario;
import TDADiccionario.Entry;
import TDADiccionario.InvalidKeyException;
import TDAListaSE.Iterator;
import TDAListaSE.NoSuchElementException;
import creador.CreadorPorArchivo;
import recursos.Coordenada;

import roles.Bala;
import roles.Malo;
import roles.Mario;
import roles.MarioGrande;
import entidades.Ladrillo;
import entidades.PowerUp;



public class Programa {
	
	protected int PUNTAJE;
	protected int vidas;
	protected MovimientoMapa movMapa;
	protected Diccionario<Integer, Malo> malos;
	protected Diccionario<Integer, Ladrillo> ladrillos;
	protected Mario elMario;
	protected MarioGrande MarioG;
	protected Mario Mario;
	protected boolean esgrande;
	protected Vector<Bala> lasBalas;
	protected Diccionario<Integer, PowerUp> powersUps;
	protected int actualX; //variable que me ayuda a controlar la 1 coordenada en x mostrada.
	protected Container J;
	
	public Programa(Container j){
		
		esgrande=false;
		Mario = new Mario(this,new Coordenada(128,352));
		MarioG=new MarioGrande(this, Mario.obtenerCoordenada());
		elMario=Mario;
		J=j;
		ladrillos = new DiccHashAb<Integer, Ladrillo>(307);
		actualX = 0;
		malos = new DiccHashAb<Integer, Malo>(10);
		movMapa = new MovimientoMapa(j, this);
		powersUps=new DiccHashAb<Integer, PowerUp> (307);
		PUNTAJE = 0;
		vidas=1;
		lasBalas = new Vector<Bala>();
	}
	public boolean HacerGrande(){
		if (Mario==elMario){
				elMario=MarioG;
				Mario.evolucion();
				return true;
		}
		else{
			return false;
		}
	}
	
	public void agregarBala(Bala b){
		lasBalas.add(b);
	}
	
	public void eliminarBala(Bala b){
		lasBalas.remove(b);
	}
	
	public void incrementarPuntaje(int punt){
		PUNTAJE += punt;
	}
	
	public void cargarMapa(){
		new CreadorPorArchivo(this);
	}
	public int obtenervidas(){
		return vidas;
	}
	public void incrementarvida(){
		vidas+=1;
	}
	public void decrementarvida(){
		vidas-=1;
	}
	
	public Vector<Bala> obtenerLasBalas(){
		return lasBalas;
	}
	
	public MovimientoMapa obtenerMovMapa(){
		return movMapa;
	}
	
	public int obtenerActualX(){
		return actualX;
	}
	
	public void establecerActualX(int x){
		actualX = x;
	}
	
	public Mario obtenerMario(){
		return elMario;
	}
	
	public Diccionario<Integer,Ladrillo> obtenerLadrillos(){
		return ladrillos;
	}
	public void agregarLadrillo(Ladrillo l){
		try{
			ladrillos.insert(l.obtenerCoordenada().obtenerX(), l);
		}catch (InvalidKeyException e){
			e.printStackTrace();
		}
	}
	
	public int cantLadrillos(){
		return ladrillos.size();
	}
	
	public void disparar(){
		Bala aux = new Bala(this, new Coordenada(elMario.obtenerCoordenada().obtenerX()+32 , elMario.obtenerCoordenada().obtenerY()));
		agregarBala(aux);
		aux.serDisparado();
	}
	
	public Ladrillo obtenerLadrillo(int x, int y){
		try{
			Iterator<Entry<Integer,Ladrillo>> it = ladrillos.findAll(x).iterator();
			while(it.hasNext()){
				Ladrillo aux = it.next().getValue();
				if(aux.obtenerCoordenada().obtenerY() == y){
					return aux;
				}
			}
		}catch(NoSuchElementException e){
			e.printStackTrace();
		}catch(InvalidKeyException e1){
			e1.printStackTrace();
		}
		return null;
	}
	
	public Malo obtenerMalo(int x, int y){
		try{
			Iterator<Entry<Integer,Malo>> it = malos.findAll(x).iterator();
			while(it.hasNext()){
				Malo aux = it.next().getValue();
				if(aux.obtenerCoordenada().obtenerY() == y){
					return aux;
				}
			}
		}catch(NoSuchElementException e){
			e.printStackTrace();
		}catch(InvalidKeyException e1){
			e1.printStackTrace();
		}
		return null;
	}

	
	public int obtenerPuntaje(){
		return PUNTAJE;
	}
	
	public Iterator<Entry<Integer,Ladrillo>> obtenerLadrillosX(int x){
		Iterator<Entry<Integer,Ladrillo>> toR = null ; 
		try {
			 toR = ladrillos.findAll(x).iterator();
		} catch (InvalidKeyException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return toR;
	}
	
	
	public void agregarMalo(Malo m){
		try {
			malos.insert(m.obtenerCoordenada().obtenerX(), m);
		} catch (InvalidKeyException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public Iterator<Entry<Integer, Malo>> obtenerMalos(){
		return malos.entries().iterator();
	}
	public int cantidadmalos(){
		return malos.size();
	}
	
	public void eliminarMalo(Entry<Integer,Malo> malo){
		try {
			malos.remove(malo);
		} catch (InvalidKeyException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public Diccionario<Integer,PowerUp> obtenerPowersUp(){
		return powersUps;
	}
	public void agregarPowerUp(PowerUp l){
		try{
			powersUps.insert(l.obtenerCoordenada().obtenerX(), l);
		}catch (InvalidKeyException e){
			e.printStackTrace();
		}
	}
	public int cantPowersUp(){
		return powersUps.size();
	}
	public PowerUp obtenerPowerUp(int x, int y){
		try{
			Iterator<Entry<Integer,PowerUp>> it = powersUps.findAll(x).iterator();
			while(it.hasNext()){
				PowerUp aux = it.next().getValue();
				if(aux.obtenerCoordenada().obtenerY() == y){
					return aux;
				}
			}
		}catch(NoSuchElementException e){
			e.printStackTrace();
		}catch(InvalidKeyException e1){
			e1.printStackTrace();
		}
		return null;
	}
	public Iterator<Entry<Integer,PowerUp>> obtenerPowersUpsX(int x){
		Iterator<Entry<Integer,PowerUp>> toR = null ; 
		try {
			 toR = powersUps.findAll(x).iterator();
		} catch (InvalidKeyException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return toR;
	}
	public Iterator<Entry<Integer, PowerUp>> obtenerPowers(){
		return powersUps.entries().iterator();
	}
	public void eliminarPU(Entry<Integer,PowerUp> PU){
		try {
			powersUps.remove(PU);
		} catch (InvalidKeyException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	
	
	
}
